import 'package:flutter/material.dart';

class StateLifeCycle extends StatefulWidget {
  @override
  State<StatefulWidget> createState() {
    return StateLifeCycleState();
  }
}

class StateLifeCycleState extends State<StateLifeCycle> {
  /**
   * 最先被执行
   */
  StateLifeCycleState() {
    print("!!!!!!!!!!!!!!!!!!!!!!   初始化");
    print("!!!!!!!!!!!   构造函数");
  }

  /**
   * 当组件插入渲染树的时候调用此方法,在生命周期中只会调用一次,可以做一些初始化工作
   */
  @override
  void initState() {
    super.initState();
    print("!!!!!!!!!!!   initState()");
  }

  /**
   *state依赖的对象发生变化时调用
   */
  @override
  void didChangeDependencies() {
    super.didChangeDependencies();
    print("!!!!!!!!!!!   didChangeDependencies()");
  }

  /**
   * 当 widget 的配置发生变化时，会调用这个函数,比如调用了setState或者Hot-reload 的时候就会调用这个函数
   * 这个函数调用后，会调用 build()。
   */
  @override
  void didUpdateWidget(StateLifeCycle oldWidget) {
    super.didUpdateWidget(oldWidget);
    print("!!!!!!!!!!!   didUpdateWidget()");
  }

  /**
   * 构建Widget时调用
   */
  var str = "Flutter";

  @override
  Widget build(BuildContext context) {
    print("!!!!!!!!!!!   build()");
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(title: Text("组件State生命周期"),),
        body: Column(
          children: <Widget>[
            Text(str),
            RaisedButton(
              child: Text("改变状态"),
              onPressed: () {
                print("!!!!!!!!!!!!!!!!!!!!!!   改变状态");
                setState(() {
                  str = "Hello Flutter";
                });
              },
            ),
            RaisedButton(
              child: Text("杀掉页面"),
              onPressed: () {
                print("!!!!!!!!!!!!!!!!!!!!!!   组件移除");
                Navigator.pop(context);
              },
            ),
          ],
        ),
      ),
    );
  }

  /**
   * 当 State 被暂时从视图树中移除时，会调用这个函数。
      页面切换时，也会调用它，因为此时 State 在视图树中的位置发生了变化，需要先暂时移除后添加。
      重写的时候必须要调用 super.deactivate()。
   */
  @override
  void deactivate() {
    super.deactivate();
    print("!!!!!!!!!!!   deactivate()");
  }

  /**
   * 当 State 被永久的从视图树中移除，Framework 会调用该函数。
   * 在调用这个函数之前，总会先调用 deactivate()。
      重写的时候必须要调用 super.dispose()。
   */
  @override
  void dispose() {
    super.dispose();
    print("!!!!!!!!!!!   dispose()");
  }
}

/**
 *  初始化：
      State初始化时会依次执行 ： 构造函数 > initState > didChangeDependencies > build , 此时页面加载完成。
    改变状态：
      调用setState后，会调用build()方法；而Hot-reload时候会调用didUpdateWidget()和build()
    组件移除：
      组件移除，例如页面销毁的时候会依次执行：deactivate > dispose
 */
//05-20 17:07:41.321 19505-19621/com.yourcompany.test1 I/flutter: !!!!!!!!!!!!!!!!!!!!!!   初始化
//05-20 17:07:41.322 19505-19621/com.yourcompany.test1 I/flutter: !!!!!!!!!!!   构造函数
//05-20 17:07:41.322 19505-19621/com.yourcompany.test1 I/flutter: !!!!!!!!!!!   initState()
//05-20 17:07:41.322 19505-19621/com.yourcompany.test1 I/flutter: !!!!!!!!!!!   didChangeDependencies()
//05-20 17:07:41.326 19505-19621/com.yourcompany.test1 I/flutter: !!!!!!!!!!!   build()
//05-20 17:07:51.684 19505-19621/com.yourcompany.test1 I/flutter: !!!!!!!!!!!!!!!!!!!!!!   改变状态
//05-20 17:07:51.694 19505-19621/com.yourcompany.test1 I/flutter: !!!!!!!!!!!   build()
//05-20 17:07:59.520 19505-19621/com.yourcompany.test1 I/flutter: !!!!!!!!!!!!!!!!!!!!!!   组件移除
//05-20 17:07:59.852 19505-19621/com.yourcompany.test1 I/flutter: !!!!!!!!!!!   deactivate()
//05-20 17:07:59.868 19505-19621/com.yourcompany.test1 I/flutter: !!!!!!!!!!!   dispose()